昨天學會使用getCheckedRadioButtonId
這功能一般都用在表單單選
例如:性別、年齡區間、問卷滿意程度
今天要的是點選完後直接變更輸出結果
比如:原本為溫度為攝氏,點選華氏RadioButton後,馬上把攝氏溫度的結果轉變為華氏的溫度結果
今天來學習速度單位轉換,把台灣常用的公里/小時和美國用的英里/小時做轉換
先拉出兩個RadioButton,並且把他們包在一個RadioGroup裡面
一個EditText給使用者輸入數值
兩個TextView分別顯示公里/小時、英里/小時的速度
當使用者輸入好數值,選擇輸入的值為公里或是英里
下面TextView馬上顯示轉換後的數值
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="70dp"
android:text="輸入格式"
android:textSize="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="@+id/textView"
app:layout_constraintStart_toStartOf="@+id/textView"
app:layout_constraintTop_toBottomOf="@+id/textView">
<RadioButton
android:id="@+id/rb_mi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="英里" />
<RadioButton
android:id="@+id/rb_km"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="公里" />
</RadioGroup>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/radioGroup" />
<TextView
android:id="@+id/tv_km"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="公里/小時:"
android:textSize="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_mi" />
<TextView
android:id="@+id/tv_mi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="英里/小時:"
android:textSize="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText" />
</androidx.constraintlayout.widget.ConstraintLayout>
增加:
RadioGroup的setOnCheckedChangeListener監聽事件:點選馬上變更顯示結果
EditText的addTextChangedListener監聽事件:新增或刪減字馬上更改結果
1公里 = 0.621371192英里
我們要把公里、英里計算完
才能顯示出來結果
因為兩個監聽事件的程式碼一樣
所以我們把計算和顯示的程式碼寫到自訂的calc()裡
之後再去呼叫
addTextChangedListener有三個要引入三個方法
目前用不到onTextChanged、beforeTextChanged
但仍需要寫這兩種方法出來
只是裡面不需要寫程式
package com.example.km;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements TextWatcher, RadioGroup.OnCheckedChangeListener {
private RadioGroup radioGroup;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
radioGroup = findViewById(R.id.radioGroup);
editText = findViewById(R.id.editText);
radioGroup.setOnCheckedChangeListener(this);
editText.addTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//目前用不到
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//目前用不到
}
@Override
public void afterTextChanged(Editable editable) {
calc();
}
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
calc();
}
private void calc() {
TextView tv_km = findViewById(R.id.tv_km);
TextView tv_mi = findViewById(R.id.tv_mi);
double km,mi;
if (radioGroup.getCheckedRadioButtonId() == R.id.rb_km){
km = Double.parseDouble(editText.getText().toString());
mi = km*0.621;
}
else{
mi = Double.parseDouble(editText.getText().toString());
km = mi/0.621;
}
tv_km.setText("公里/小時:"+km);
tv_mi.setText("英里/小時:"+mi);
}
}
執行結果:
預設為英里
點選英里
點選公里